#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct nod{
	float d,v,a;
}car[100000];
long long cs[1000000];
int pd[10000][10000],pd2[10000][10000];
long long ans2,n,m,ans;
int sc(long long x,long long b)
{
	ans2=max(ans2,b);
	long long i,j,k,num;
	for(i=x;i<=n;i++)
	{
	for(j=1;j<=m;j++)
	    pd[j][i]=0;
	num=0;
	for(j=1;j<=n;j++)
	  for(k=1;k<=m;k++)
	    if(pd[j][k]==1)
	    {
		num++;
		break;	
	    }
	if(num==ans)
	  sc(i+1,b+1);
	else
	{
	for(j=1;j<=n;j++)
		for(k=1;k<=m;k++)
		    pd[j][k]=pd2[j][k];
	return 0;
	}		  
	}
	return 0;
}
int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	long long t,l,v2,i,j,k;
	float s;
	cin>>t;
	for(i=1;i<=t;i++)
	{
		cin>>n>>m>>l>>v2;
		for(j=1;j<=n;j++)
		  cin>>car[j].d>>car[j].v>>car[j].a;
		for(j=1;j<=m;j++)
		  cin>>cs[j];
		sort(cs+1,cs+m+1);
		for(j=1;j<=n;j++)
		if(car[j].a==0&&car[j].v<v2)
		  continue;
		else if(car[j].a==0&&car[j].v>v2)
	    {
		ans++;
		for(k=1;k<=m;k++)
		  if(cs[k]>car[j].d)
		  {
			pd[j][k]=1;
			pd2[j][k]=1;
		  }
		}
		else if(car[j].a>0)
		{
	    bool flag=false;
	    s=0;
		s=sqrt((v2*v2-car[j].v*car[j].v)/(2*car[j].a));
		s=s+car[j].d;
		for(k=1;k<=m;k++)
		  if(cs[k]>s&&cs[k]>=car[j].d)
		  {
		  flag=true;
		  pd[j][k]=1;
		  pd2[j][k]=1;
		  }
		if(flag==true)
		  ans++;
		}
		else 
		{
		bool flag=false;
	    s=0;
		s=(v2*v2-car[j].v*car[j].v)/(2*car[j].a);
		s=s+car[j].d;
		for(k=1;k<=m;k++)
		  if(cs[k]<s&&cs[k]>=car[j].d)
		  {
		  flag=true;
		  pd[j][k]=1;
		  pd2[j][k]=1;
		  }
		if(flag==true)
		  ans++;
		}
		cout<<ans<<" ";
		sc(1,0);
		cout<<ans2<<endl;
	}
	/*for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		  cout<<pd[i][j]<<" ";
		 cout<<endl;
	}*/
	return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 4
5 5 ‐2
6 4 ‐4
2 5 8 9 15
 */
